/** 【文件说明】：日期时间处理工具类
 *  【使用例子】：
 
    import { DateTimeUtils } from '@/utils/dateTimeUtils';

    // 在某个方法或生命周期钩子中使用
    console.log(DateTimeUtils.format(new Date(), 'yyyy-MM-dd hh:mm:ss')); // 输出格式化的日期和时间
    console.log(DateTimeUtils.dateDiffInDays(new Date('2023-01-01'), new Date())); // 计算两个日期间的天数差
    console.log(DateTimeUtils.timeDiffInHours(new Date('2023-01-01T08:00:00'), new Date('2023-01-01T10:00:00'))); // 计算两个时间点之间的小时差
    console.log(DateTimeUtils.timeDiffInMinutes(new Date('2023-01-01T08:00:00'), new Date('2023-01-01T09:30:00'))); // 计算两个时间点之间的分钟差
    console.log(DateTimeUtils.isLeapYear(2024)); // 判断2024年是否为闰年
    console.log(DateTimeUtils.getCurrentTimestamp()); // 获取当前时间戳
    console.log(DateTimeUtils.getDayOfWeek(new Date())); // 获取今天是星期几
    console.log(DateTimeUtils.addDays(new Date(), 5).toLocaleDateString()); // 添加5天后的日期
    console.log(DateTimeUtils.addHours(new Date(), 2).toLocaleTimeString()); // 添加2小时后的时间
    console.log(DateTimeUtils.addMinutes(new Date(), 30).toLocaleTimeString()); // 添加30分钟后的时间

 */
export class DateTimeUtils {
    /**
     * 格式化日期
     * @param date 要格式化的日期
     * @param fmt 格式字符串
     * @returns 返回格式化后的日期字符串
     */
    static format(date: Date, fmt: string): string {
      const o: { [key: string]: number } = {
        'M+': date.getMonth() + 1, // 月份
        'd+': date.getDate(), // 日
        'h+': date.getHours(), // 小时
        'm+': date.getMinutes(), // 分
        's+': date.getSeconds(), // 秒
        'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
        S: date.getMilliseconds() // 毫秒
      };
  
      if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
      }
  
      for (const k in o) {
        if (new RegExp('(' + k + ')').test(fmt)) {
          fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k] as any) : ('00' + o[k]).substr(('' + o[k]).length));
        }
      }
  
      return fmt;
    }
  
    /**
     * 计算两个日期之间的差值（天数）
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @returns 返回两个日期之间的天数差
     */
    static dateDiffInDays(date1: Date, date2: Date): number {
      const timeDiff = Math.abs(date2.getTime() - date1.getTime());
      return Math.ceil(timeDiff / (1000 * 3600 * 24));
    }
  
    /**
     * 计算两个时间点之间的时间差（小时）
     * @param date1 第一个时间点
     * @param date2 第二个时间点
     * @returns 返回两个时间点之间的小时差
     */
    static timeDiffInHours(date1: Date, date2: Date): number {
      const timeDiff = Math.abs(date2.getTime() - date1.getTime());
      return Math.round(timeDiff / (1000 * 3600));
    }
  
    /**
     * 计算两个时间点之间的时间差（分钟）
     * @param date1 第一个时间点
     * @param date2 第二个时间点
     * @returns 返回两个时间点之间的分钟差
     */
    static timeDiffInMinutes(date1: Date, date2: Date): number {
      const timeDiff = Math.abs(date2.getTime() - date1.getTime());
      return Math.round(timeDiff / (1000 * 60));
    }
  
    /**
     * 判断是否为闰年
     * @param year 年份
     * @returns 如果是闰年则返回 true，否则返回 false
     */
    static isLeapYear(year: number): boolean {
      return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
    }
  
    /**
     * 获取当前时间戳
     * @returns 返回当前时间戳
     */
    static getCurrentTimestamp(): number {
      return new Date().getTime();
    }
  
    /**
     * 获取今天是星期几
     * @param date 日期
     * @returns 返回星期几的字符串
     */
    static getDayOfWeek(date: Date): string {
      const daysOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
      return daysOfWeek[date.getDay()];
    }
  
    /**
     * 添加指定天数后的日期
     * @param date 日期
     * @param days 天数
     * @returns 返回添加指定天数后的日期
     */
    static addDays(date: Date, days: number): Date {
      const result = new Date(date);
      result.setDate(result.getDate() + days);
      return result;
    }
  
    /**
     * 添加指定小时数后的时间
     * @param date 时间
     * @param hours 小时数
     * @returns 返回添加指定小时数后的时间
     */
    static addHours(date: Date, hours: number): Date {
      const result = new Date(date);
      result.setTime(result.getTime() + hours * 60 * 60 * 1000);
      return result;
    }
  
    /**
     * 添加指定分钟数后的时间
     * @param date 时间
     * @param minutes 分钟数
     * @returns 返回添加指定分钟数后的时间
     */
    static addMinutes(date: Date, minutes: number): Date {
      const result = new Date(date);
      result.setTime(result.getTime() + minutes * 60 * 1000);
      return result;
    }
  }